/**
 * @file utf_8_to_gbk.c
 * @brief 文字编码转换工具函数
 */

/*********************
 *      INCLUDE
 *********************/
//导入库
#include <windows.h>  // 需要包含这个头文件
#include <iconv.h>
//导入自定义头文件
#include "utf-8_to_gbk.h"


/**********************
 *   GLOBAL FUNCTIONS
 **********************/
// UTF-8 转 GBK 函数
char* utf8_to_gbk(const char* utf8_str) {
    if(!utf8_str) return NULL;

    int len = MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, NULL, 0);
    if(len == 0) return NULL;

    wchar_t* wstr = (wchar_t*)malloc(len * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, wstr, len);

    len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* gbk_str = (char*)malloc(len);
    WideCharToMultiByte(CP_ACP, 0, wstr, -1, gbk_str, len, NULL, NULL);

    free(wstr);
    return gbk_str;
}

// GBK 转 UTF-8 函数
char* gbk_to_utf8(const char* gbk_str) {
    if(!gbk_str) return NULL;

    // 第一步：将 GBK 转换为宽字符（Unicode）
    int len = MultiByteToWideChar(CP_ACP, 0, gbk_str, -1, NULL, 0);
    if(len == 0) return NULL;

    wchar_t* wstr = (wchar_t*)malloc(len * sizeof(wchar_t));
    if(!wstr) return NULL;

    if(MultiByteToWideChar(CP_ACP, 0, gbk_str, -1, wstr, len) == 0) {
        free(wstr);
        return NULL;
    }

    // 第二步：将宽字符（Unicode）转换为 UTF-8
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
    if(len == 0) {
        free(wstr);
        return NULL;
    }

    char* utf8_str = (char*)malloc(len);
    if(!utf8_str) {
        free(wstr);
        return NULL;
    }

    if(WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8_str, len, NULL, NULL) == 0) {
        free(wstr);
        free(utf8_str);
        return NULL;
    }

    free(wstr);
    return utf8_str;
}

// 封装打印函数
void print_gbk(const char* format, ...) {
    va_list args;
    va_start(args, format);

    // 格式化字符串
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), format, args);

    // 转换编码并打印
    char* gbk_buffer = utf8_to_gbk(buffer);
    if(gbk_buffer) {
        printf("%s", gbk_buffer);
        free(gbk_buffer);
    } else {
        printf("%s", buffer);  // 转换失败时直接打印
    }

    va_end(args);
}
